perm filename DSKFIL.MAC[GPR,LCS]1 blob
sn#138799 filedate 1975-01-07 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00003 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE DSKFIL
C00006 00003 SUBTTL SUBROUTINES
C00015 ENDMK
C⊗;
TITLE DSKFIL
SUBTTL MAIN ROUTINE
A==1 ;SCRATCH AC'S
B==2
C==3
D==4
CLUSTR==6 ;NUMBER OF BLOCKS LEFT IN THIS CLUSTER HELD HERE
T1==7 ;AC TO HOLD RIB POINTER TO NEXT CLUSTER(S) OF FILE
BLKNUM==16 ;TELLS GETBLK WHICH BLOCK TO GET OFF THE DSK
P==17 ;PUSH DOWN STACK
PDLEN==20 ;ARBITRARY LENGTH OF PUSH DOWN STACK
;
LOC 752 ;LOCATION OF FIRST CONTROL WORD FOR DF10
EXP GETDAT ;TRANSFER TO LOCATION GETDAT FOR IOWD WORD(S)
;
LOC 14000 ;START OF PROGRAM ABOVE EDDT
START: MOVE A,116 ;GET THE SYMBOL TABLE POINTER
MOVEM A,36 ;AND MAKE IT AVAILABLE TO EDDT
JRST DDT## ;AND GO TO EDDT!
START2: MOVE P,[IOWD PDLEN,PDL];HERE TO START THE PRG. SET UP THE STACK
PUSHJ P,INITIA ;SETUP THE PI CHANNELS, CLEAR I/O, ETC....
PUSHJ P,GETHOM ;GET THE HOME BLOCK INFORMATION
MOVE BLKNUM,MFD ;GET THE LOGICAL BLOCK NUMBER OF [1,1]
PUSHJ P,GETRIB ;GET THE RIB
MORMFD: PUSHJ P,NXTBLK ;ADVANCE BLKNUM TO THE NEXT BLOCK OF [1,1]
HALT . ;END OF FILE.....ERROR!!!!
PUSHJ P,GETBLK ;GET THE BLOCK FROM THE DSK
MOVEI A,176 ;SEARCH FOR [1,4] FROM BOTTOM UP
TRYSYS: MOVE C,BLOCK(A) ;GET A UFD NAME
CAMN C,[XWD 1,4] ;IS IT SYS?
JRST GOTSYS ;YES, GO LOOK FOR THE FILE IN [1,4].UFD
SUBI A,2 ;NO, WE DON'T HAVE SYS, DECREMENT TO NEXT PPN
JUMPGE A,TRYSYS ;GO TRY AGAIN
JRST MORMFD ;NO MORE IN THIS BLOCK, GET THE NEXT ONE
GOTSYS: HRRZ BLKNUM,BLOCK+1(A);NOW, GET THE CLUSTER ADR TO THE RIB OF [1,4].UFD
IMUL BLKNUM,BPC ;TURN IT INTO A LOGICAL BLOCK NUMBER
PUSHJ P,GETRIB ;GET [1,4]'S RIB
PUSHJ P,NXTBLK ;GET THE NEXT BLOCK OF THE UFD
HALT . ;END OF FILE.....ERROR!!!!
PUSHJ P,GETBLK ;GET A BLOCK OF THE UFD
MOVEI A,176 ;AND SEARCH IN THE SAME MANNER AS BEFORE FOR DTADIR.HLP
TRYRIB: MOVE C,BLOCK(A) ;GET THE FILE NAME
CAMN C,[SIXBIT/DTADIR/];IS IT DTADIR?
JRST TRYHLP ;YES, IS IT THE HELP FILE?
MORSYS: SUBI A,2 ;NO DECREMENT TO THE NEXT FILE IN THE UFD
JUMPGE A,TRYRIB ;GO GET IT
JRST GOTSYS+3 ;IN THIS CASE, GET ANOTHER BLOCK OF THE FILE
TRYHLP: HLRZ C,BLOCK+1(A) ;GET THE EXTENSION
CAIE C,'HLP' ;IS IT REALLY THE HELP FILE?
JRST MORSYS ;NO GET ANOTHER FILE
HRRZ BLKNUM,BLOCK+1(A);YES! GET THE CLUSTER ADR
IMUL BLKNUM,BPC ;CONVERT TO A BLOCK NUMBER
PUSHJ P,GETRIB ;AND GET ITS RIB
PUSHJ P,GETFIL ;NOW, READ THAT FILE!
PUSHJ P,PRINT ;AND PRINT IT ON THE LPT
CONO PI,400 ;TURN OFF THE PI SYSTEM
JRST DDT ;AND GO TO EDDT
SUBTTL SUBROUTINES
INITIA: MOVEI B,41 ;LOAD LOCATIONS 41 THROUGH 57 (PI CHANNELS) WITH HALTS
MOVE A,[HALT 57] ;GET THE HALT INSTRUCTION
MOVEM A,(A) ;PUT IT AWAY
CAIE B,(A) ;HAVE WE WRITTEN LOCATION 41 YET?
SOJA A,INITIA+2 ;NO, GO WRITE ANOTHER LOCATION
MOVE A,[JSR DSKSER] ;SET UP PI CHANNEL 1 TO HANDLE DSK SERVICE
MOVEM A,42 ;PUT THE JSR IN THE RIGHT PLACE
CONO APR,675550 ;CLEAR ALL I/O DEVICES, AND ALL PARITY, NXM'S, ETC...
CONO PI,10000 ;CLEAR THE PI SYSTEM
CONO DPC,175720 ;CLEAR THE DSK PACK CONTROLLER (RP10)
CONO DPC,10 ;CLEAR SOME MORE OF THE RP10
CONO DPC,1 ;PUT THE RP10 ON PI CHANNEL 1
CONO PI,2300 ;ACTIVATE THE PI SYSTEM
POPJ P, ;RETURN
;
GETHOM: MOVEI BLKNUM,1 ;GET THE HOME BLOCK, READ IT FROM BLOCK 1
PUSHJ P,GETBLK ;GET THE BLOCK IN CORE
MOVE A,BLOCK+14 ;GET THE NUMBER OF BLOCKS PER CLUSTER
MOVEM A,BPC ;AND SAVE IT
MOVE A,BLOCK+16 ;GET THE NUMBER OF CLUSTERS PER UNIT
MOVEM A,CPU ;AND SAVE THAT TOO
MOVE A,BLOCK+20 ;GET BYTE POINTER TO LOAD CLUSTER COUNT FROM RIB PNT.
MOVEM A,CLSCNT ;AND SAVE IT
MOVE A,BLOCK+20 ;GET BYTE POINTER TO LOAD CLUSTER ADDRESS FROM RIB PNT.
MOVEM A,CLSADR ;AND SAVE THAT TOO
MOVE A,BLOCK+46 ;GET LOGICAL BLOCK NUMBER OF THE MFD
MOVEM A,MFD ;AND ONCE AGAIN......SAVE IT!
POPJ P, ;RETURN
;
GETRIB: PUSHJ P,GETBLK ;GET THE RIB BLOCK
HRRZ T1,BLOCK ;GET INDEX INTO RIB TO GET RIB POINTERS TO THE FILE
MOVE T1,BLOCK(T1) ;GET THE FIRST POINTER TO THE FILE
LDB CLUSTR,CLSCNT ;GET THE NUMBER OF CLUSTERS IN THIS POINTER
IMUL CLUSTR,BPC ;AND CONVERT TO BLOCKS
MOVNI CLUSTR,-1(CLUSTR);AND PUT -(COUNT-1) IN THE COUNTER
MOVE A,BLOCK ;GET THE INDEX INTO THE RIB TO GET TO THE RIB POINTERS
HRLI B,BLOCK(A) ;GET THE ADR OF THE FIRST RIB
HRRI B,RIBPNT ;SO WE CAN BLT TO ANOTHER SECTION OF CORE
HLRES A ;GET COUNT OF NUMBER OF POINTERS IN A
MOVNS A ;MAKE IT POSITIVE!
BLT B,RIBPNT(A) ;AND BLT THOSE POINTERS AWAY!
MOVEI A,RIBPNT+2 ;IGNORE THE FIRST 2 POINTERS, USE THE REST
MOVEM A,RIBCNT ;SAVE INDEX INTO RIBPNT
POPJ P, ;RETURN
;
GETFIL: MOVE C,BLOCK+5 ;GET LENGTH OF FILE FROM RIB
MOVEM C,FILEN ;SAVE IT TO PRINT THE FILE
MOVE D,[IOWD 200,FILE];INITIAL CONTROL WORD FOR THE DF-10
MOVEM D,GETDAT ;MAKE IT AVAILABLE TO THE DF-10
GETFL2: PUSHJ P,NXTBLK ;GET BLOCK OF FILE
POPJ P, ;END OF FILE, RETURN
PUSHJ P,DATIN ;GET THE BLOCK OF THE FILE
MOVEI D,200 ;ADD ONE BLOCK OF WORDS TO THE DF-10 IOWD
ADDM D,GETDAT ;ADD IT
JRST GETFL2 ;AND GET THE NEXT BLOCK OF THE FILE
;
NXTBLK: AOJG CLUSTR,NXTCLS ;HAVE WE FINISHED READING FROM THIS CLUSTER?
ADDI BLKNUM,1 ;NO, INCREASE THE BLOCK NUMBER BY ONE
AOS (P) ;GIVE A SKIP RETURN
POPJ P, ;AND RETURN
NXTCLS: MOVE T1,@RIBCNT ;GET THE NEXT RIB POINTER
JUMPE T1,[POPJ P,] ;NON-SKIP RETURN IF DONE (EOF)
LDB CLUSTR,CLSCNT ;GET THE CLUSTER COUNT OUT OF THE POINTER
JUMPE CLUSTR,NEWUNI ;IF ZERO, THIS IS A CHANGE OF UNIT POINTER
IMUL CLUSTR,BPC ;CONVERT TO BLOCKS
MOVNI CLUSTR,-1(CLUSTR);AND PUT -(COUNT-1) IN COUNTER
LDB BLKNUM,CLSADR ;GET CLUSTER ADDRESS
IMUL BLKNUM,BPC ;CONVERT TO A LOGICAL BLOCK NUMBER
AOS RIBCNT ;UPDATE THE RIB INDEX
JRST NXTBLK+2 ;AND GIVE A SKIP RETURN
NEWUNI: AOS RIBCNT ;NEW UNIT, IGNORE IT IN THIS PROGRAM
JRST NXTCLS ;AND GET THE NEXT RIB POINTER
;
PRINT: MOVN A,FILEN ;FORM AOBJN WORD TO READ ALL THE FILE WORD BY WORD
HRLZS A ;PUT NEGITIVE COUNT IN LEFT HALF, ZERO IN RIGHT HALF
MOVE B,FILE(A) ;GET A WORD
CONSZ LPT,200 ;IS THE LPT READY FOR ANOTHER WORD?
JRST .-1 ;NO, LET'S WAIT
DATAO LPT,B ;YES, PRINT IT
AOBJN A,PRINT+2 ;GO FOR MORE
POPJ P, ;RETURN
;
GETBLK: MOVE A,[IOWD 200,BLOCK];GET IOWD WORD TO READ ONE BLOCK INTO LOC BLOCK
MOVEM A,GETDAT ;AND TELL THE DF-10 ABOUT IT
DATIN: MOVE A,BLKNUM ;GET THE BLOCK NUMBER TO FIND THE PROPER CYLINDER
IDIVI A,↑D200 ;GET THE CYLINDER
LSH A,↑D22 ;PUT IT IN THE RIGHT PLACE FOR A DATAO
MOVEM A,D ;SAVE IT FOR LATER
TLO A,400000 ;FUNCTION 4 = POSTION HEADS
DATAO DPC,A ;TELL THE RP-10 WHAT WE WANT DONE
AOJA . ;AND WAIT
MOVE A,BLKNUM ;NOW, FORM THE SURFACE AND SECTOR ADDRESS
IDIVI A,↑D20 ;20 SURFACES PER CYLINDER
IDIVI B,↑D10 ;10 SECTORS PER SURFACE
LSH B,↑D17 ;SHIFT SURFACE ADR OVER INTO POSTION
ADD D,B ;ADD IT TO THE CYLINDER ADR
LSH C,↑D12 ;SHIFT SECTOR ADR OVER INTO POSTION
ADDI D,752(C) ;ADD THAT PLUS THE ADR OF THE INITIAL CONTROL WORD ADR
DATAO DPC,D ;READ CODE=0
AOJA . ;WAIT FOR DSK TO RESPOND
POPJ P, ;RETURN
;
;
DSKSER: Z ;HERE ON PI CHANNEL 1 INTERRUPT
CONI DPC,A ;GET STATUS BITS OF RP-10
TRNE A,377700 ;ANY ERRORS?
HALT . ;YES....(MY FANTASTIC ERROR RECOVORY...LIKE IT?)
DATAI DPC,A ;GET STATUS BITS OF DRIVES
TLNE A,114 ;ANY ERRORS?
HALT . ;YUP!!!
CONO DPC,10 ;CLEAR DONE
DATAO DPC,[XWD 500000,776];GIVE AN AT EASE, CLEARING THE INTERRUPT
AOS DSKSER ;GIVE SKIP RETURN-THEREBY SKIPING OVER NULL JOB
CONO DPC,1 ;PUT DPC ON PI CHANNEL 1
JEN @DSKSER ;CLEAR PI INTERRUPT AND RETURN
;
;
PDL: BLOCK PDLEN ;PUSH DOWN STACK
BPC: Z ;BLOCKS PER CLUSTER
CPU: Z ;CLUSTERS PER UNIT
CLSCNT: Z ;BYTE POINTER TO GET CLUSTER COUNT (HOME BLOCK)
CLSADR: Z ;BYTE POINTER TO GET CLUSTER ADR (HOME BLOCK)
MFD: Z ;BLOCK NUMBER OF MFD BEGINNING
RIBCNT: Z ;INDEX INTO RIBPNT
RIBPNT: BLOCK 150 ;RIB POINTERS FROM RIB STORED HERE
FILEN: Z ;LENGTH OF FILE WE'RE READING
FILE: BLOCK 20*200 ;AREA TO STORE FILE IN CORE
GETDAT: BLOCK 3 ;IOWD WORD(S) FOR DF-10
PATCH: BLOCK 2000 ;PATCH AREA
BLOCK: BLOCK 200 ;AREA TO READ IN A BLOCK OF THE DSK
END START